home *** CD-ROM | disk | FTP | other *** search
/ Komputer for Alle 2004 #2 / K-CD-2-2004.ISO / OpenOffice Sv / f_0397 / python-core-2.2.2 / lib / test / test_pty.py < prev    next >
Encoding:
Python Source  |  2003-07-18  |  3.0 KB  |  99 lines

  1. import pty, os, sys
  2. from test_support import verbose, TestFailed, TestSkipped
  3.  
  4. TEST_STRING_1 = "I wish to buy a fish license.\n"
  5. TEST_STRING_2 = "For my pet fish, Eric.\n"
  6.  
  7. if verbose:
  8.     def debug(msg):
  9.         print msg
  10. else:
  11.     def debug(msg):
  12.         pass
  13.  
  14. # Marginal testing of pty suite. Cannot do extensive 'do or fail' testing
  15. # because pty code is not too portable.
  16.  
  17. try:
  18.     debug("Calling master_open()")
  19.     master_fd, slave_name = pty.master_open()
  20.     debug("Got master_fd '%d', slave_name '%s'"%(master_fd, slave_name))
  21.     debug("Calling slave_open(%s)"%`slave_name`)
  22.     slave_fd = pty.slave_open(slave_name)
  23.     debug("Got slave_fd '%d'"%slave_fd)
  24. except OSError:
  25.     # " An optional feature could not be imported " ... ?
  26.     raise TestSkipped, "Pseudo-terminals (seemingly) not functional."
  27.  
  28. if not os.isatty(slave_fd):
  29.     raise TestFailed, "slave_fd is not a tty"
  30.  
  31. # IRIX apparently turns \n into \r\n. Allow that, but avoid allowing other
  32. # differences (like extra whitespace, trailing garbage, etc.)
  33.  
  34. debug("Writing to slave_fd")
  35. os.write(slave_fd, TEST_STRING_1)
  36. s1 = os.read(master_fd, 1024)
  37. sys.stdout.write(s1.replace("\r\n", "\n"))
  38.  
  39. debug("Writing chunked output")
  40. os.write(slave_fd, TEST_STRING_2[:5])
  41. os.write(slave_fd, TEST_STRING_2[5:])
  42. s2 = os.read(master_fd, 1024)
  43. sys.stdout.write(s2.replace("\r\n", "\n"))
  44.  
  45. os.close(slave_fd)
  46. os.close(master_fd)
  47.  
  48. # basic pty passed.
  49.  
  50. debug("calling pty.fork()")
  51. pid, master_fd = pty.fork()
  52. if pid == pty.CHILD:
  53.     # stdout should be connected to a tty.
  54.     if not os.isatty(1):
  55.         debug("Child's fd 1 is not a tty?!")
  56.         os._exit(3)
  57.  
  58.     # After pty.fork(), the child should already be a session leader.
  59.     # (on those systems that have that concept.)
  60.     debug("In child, calling os.setsid()")
  61.     try:
  62.         os.setsid()
  63.     except OSError:
  64.         # Good, we already were session leader
  65.         debug("Good: OSError was raised.")
  66.         pass
  67.     except AttributeError:
  68.         # Have pty, but not setsid() ?
  69.         debug("No setsid() available ?")
  70.         pass
  71.     except:
  72.         # We don't want this error to propagate, escaping the call to
  73.         # os._exit() and causing very peculiar behavior in the calling
  74.         # regrtest.py !
  75.         # Note: could add traceback printing here.
  76.         debug("An unexpected error was raised.")
  77.         os._exit(1)
  78.     else:
  79.         debug("os.setsid() succeeded! (bad!)")
  80.         os._exit(2)
  81.     os._exit(4)
  82. else:
  83.     debug("Waiting for child (%d) to finish."%pid)
  84.     (pid, status) = os.waitpid(pid, 0)
  85.     res = status >> 8
  86.     debug("Child (%d) exited with status %d (%d)."%(pid, res, status))
  87.     if res == 1:
  88.         raise TestFailed, "Child raised an unexpected exception in os.setsid()"
  89.     elif res == 2:
  90.         raise TestFailed, "pty.fork() failed to make child a session leader."
  91.     elif res == 3:
  92.         raise TestFailed, "Child spawned by pty.fork() did not have a tty as stdout"
  93.     elif res != 4:
  94.         raise TestFailed, "pty.fork() failed for unknown reasons."
  95.  
  96. os.close(master_fd)
  97.  
  98. # pty.fork() passed.
  99.